#!/bin/sh

logger="GlogY.sh"
desbloqueador="desbloquear_pid.sh"

pid_bloqueante ()
{
	local nice_name="$(basename $1)"
	local pid_file="$PIDDIR/$nice_name.pid" 

	if [ -r "$pid_file" ] && [ '' != "$(cat "$pid_file")" ] ; then
		echo "$(pidof -x "$nice_name" | tr '[:space:]' '\n' | grep "$(cat "$pid_file")")"
	fi
}

logger_echo ()
{
	# reemplazo de GlogY que escribe a stdout
	echo $3
}

mensaje_ayuda ()
{
	cat <<EOM
Cantidad de parametros incorrecto. El uso de este script es:

  $0 [-K] [-l <Nombre Invocador>] [-t <Timeout>] <Comando>

Donde las opciones son:
  -t: Tiempo en segundos a esperar antes de dar error o usar SIGKILL.
      (Por defecto espera 10 segundos)
  -l: Nombre del comando que solicita detener el proceso. De uso interno del
      sistema.
  -K: En lugar de dar error al finalizar el tiempo de espera, usar SIGKILL
      para terminar forzozamente el proceso. (Por defecto, no usa SIGKILL)
EOM
}

# -------------------------------- PRINCIPAL --------------------------------

invocador=""
espera=10
usar_sigkill=false

while getopts ":Kl:t:" opt ; do
	case $opt in
	K)
		usar_sigkill=true
		;;
	l)
		invocador=$OPTARG
		;;
	t)
		if [ "$OPTARG" -gt 0 ] 2> /dev/null ; then
			espera=$OPTARG
		fi
		;;
	:)
		echo "La opcion -$OPTARG requiere un argumento"
		mensaje_ayuda
		exit 1
		;;
	esac
done
shift $((OPTIND-1))

# verifico argumentos
if [ "$#" -gt 1 ] ; then
	mensaje_ayuda
	exit 2
fi

# verifico el entorno
if [ "$INICIO_OK" != "grupo06" ] ; then
	echo "ERROR: El ambiente no esta correctamente inicializado."
	echo "       Por favor ejecute InicioY.sh"
	exit 3
fi

pid_blk="$(pid_bloqueante "$1")"

if [ '' = "$pid_blk" ] ; then
	echo "El comando '$1' no esta corriendo en este momento."
else
	if [ '' = "$invocador" ] ; then
		# si no logueo a archivo, redirijo a stdout
		logger='logger_echo'
	fi
	
	$logger "$invocador" "I" "Intentando detener '$1'."

	kill "$pid_blk"
	while [ '' != "$pid_blk" ] && [ "$espera" -gt 0 ] ; do
		espera=$(($espera - 1))
		sleep 1
		pid_blk="$(pid_bloqueante "$1")"
	done

	if [ '' = "$pid_blk" ] ; then
		$logger "$invocador" "I" "Terminado '$1' normalmente."
		$desbloqueador "$1"
	elif [ $usar_sigkill = true ] ; then
		kill -9 "$pid_blk"
		$logger "$invocador" "W" "Terminado '$1' con SIGKILL."
		$desbloqueador "$1"
	else
		$logger "$invocador" "E" "No se termino '$1'"
		exit 4
	fi
fi

